package go_service

import "fmt"

// 定义合法的启动类型
var validStartTypes = map[string]bool{
	"simple":  true,
	"forking": true,
	"oneshot": true,
	"dbus":    true,
	"notify":  true,
	"idle":    true,
}

// 定义合法的重启策略
var validRestartPolicies = map[string]bool{
	"no":          true,
	"always":      true,
	"on-success":  true,
	"on-failure":  true,
	"on-abnormal": true,
	"on-watchdog": true,
	"on-abort":    true,
}

// ValidateStartType 验证启动类型是否合法
func ValidateStartType(startType string) error {
	if !validStartTypes[startType] {
		return fmt.Errorf("invalid start type: %s, must be one of: simple, forking, oneshot, dbus, notify, idle", startType)
	}
	return nil
}

// ValidateRestartPolicy 验证重启策略是否合法
func ValidateRestartPolicy(restartPolicy string) error {
	if !validRestartPolicies[restartPolicy] {
		return fmt.Errorf("invalid restart policy: %s, must be one of: no, always, on-success, on-failure, on-abnormal, on-watchdog, on-abort", restartPolicy)
	}
	return nil
}

// GetValidStartTypes 返回所有合法的Systemd启动类型
//
// 返回值:
//
//	[]string: 包含所有支持的启动类型字符串的切片
//
// 示例:
//
//	validTypes := GetValidStartTypes()
//	fmt.Printf("支持的启动类型: %v\n", validTypes)
//	// 输出: 支持的启动类型: [simple forking oneshot dbus notify idle]
func GetValidStartTypes() []string {
	return []string{"simple", "forking", "oneshot", "dbus", "notify", "idle"}
}

// GetValidRestartPolicies 返回所有合法的Systemd重启策略
//
// 返回值:
//
//	[]string: 包含所有支持的重启策略字符串的切片
//
// 示例:
//
//	validPolicies := GetValidRestartPolicies()
//	fmt.Printf("支持的重启策略: %v\n", validPolicies)
//	// 输出: 支持的重启策略: [no always on-success on-failure on-abnormal on-watchdog on-abort]
func GetValidRestartPolicies() []string {
	return []string{"no", "always", "on-success", "on-failure", "on-abnormal", "on-watchdog", "on-abort"}
}

// SetStartType 设置服务的启动类型
//
// 参数:
//
//	startType: 启动类型（必须是以下之一: "simple", "forking", "oneshot", "dbus", "notify", "idle"）
//
// 返回值:
//
//	*Service: 返回服务实例本身，支持链式调用
//
// 示例:
//
//	service.SetStartType("forking").SetRestartPolicy("on-failure")
func (s *Service) SetStartType(startType string) *Service {
	// 这里我们不进行验证，只在Validate时统一验证
	s.StartType = startType
	return s
}

// SetRestartPolicy 设置服务的重启策略
//
// 参数:
//
//	policy: 重启策略（必须是以下之一: "no", "always", "on-success", "on-failure", "on-abnormal", "on-watchdog", "on-abort"）
//
// 返回值:
//
//	*Service: 返回服务实例本身，支持链式调用
//
// 示例:
//
//	service.SetRestartPolicy("on-failure").SetStartType("forking")
func (s *Service) SetRestartPolicy(policy string) *Service {
	// 这里我们不进行验证，只在Validate时统一验证
	s.RestartPolicy = policy
	return s
}

// Validate 验证服务的所有配置是否合法
func (s *Service) Validate() error {
	// 验证服务名称
	if s.Name == "" {
		return fmt.Errorf("service name cannot be empty")
	}

	// 验证可执行文件路径
	if s.ExecPath == "" {
		return fmt.Errorf("executable path cannot be empty")
	}

	// 验证启动类型
	if err := ValidateStartType(s.StartType); err != nil {
		return err
	}

	// 验证重启策略
	if err := ValidateRestartPolicy(s.RestartPolicy); err != nil {
		return err
	}

	// 验证目标单元
	if s.WantedBy == "" {
		return fmt.Errorf("wanted by target cannot be empty")
	}

	return nil
}
